/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package ar.com.remiseria.bo;

import ar.com.remiseria.dao.AutoDAO;
import ar.com.remiseria.dao.ChoferDAO;
import ar.com.remiseria.entities.Auto;
import ar.com.remiseria.entities.Chofer;
import ar.com.remiseria.entities.Documento;
import ar.com.remiseria.entities.Domicilio;
import ar.com.remiseria.utils.Constantes;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.exception.DataException;

/**
 *
 * @author mcvalls
 *
 * Aqui va toda la logica de negocios correspondiente a las operaciones con
 * choferes.
 */
public class ChoferBO {

    public List<Chofer> getAllChoferes() throws Exception {

        List<Chofer> losChoferes = new ArrayList<Chofer>();

        try {
            ChoferDAO choferDAO = new ChoferDAO();
            losChoferes = choferDAO.getAll(Chofer.class);
        } catch (HibernateException hex) {
            throw new Exception(hex);
        }

        return losChoferes;

    }

    public Chofer saveNewChofer(Chofer chofer) throws Exception {

        if (this.validarChofer(chofer)) {

            Domicilio domicilioChofer = chofer.getDomicilio();
            DomicilioBO domicilioBO = new DomicilioBO();
            Documento documentoChofer = chofer.getDocumento();
            DocumentoBO documentoBO = new DocumentoBO();
            ChoferDAO choferDAO = new ChoferDAO();
            try{
                domicilioChofer = domicilioBO.saveNewDomicilioIfNotExists(domicilioChofer); // Guardo el domicilio
                chofer.setDomicilio(domicilioChofer);
                documentoChofer = documentoBO.saveNewDocumentoIfNotExists(documentoChofer); // Guardo el documento
                chofer.setDocumento(documentoChofer);
                chofer = choferDAO.saveNew(chofer); // Guardo el chofer
            }catch(HibernateException ex){
                throw new Exception(ex);
            }catch(Exception hex){
                throw new Exception(hex);
            }
            
            
        } else {
            throw new Exception("Ha ocurrido un error, por favor revise los datos ingresados.");
        }

        return chofer;

    }

    private boolean validarChofer(Chofer chofer) {
        if (chofer.getApellido() == null) {
            return false;
        }
        if (chofer.getNombre() == null) {
            return false;
        }
        if (chofer.getDocumento().getNumero() == null) {
            return false;
        }

        return true;
    }

    public Chofer updateChofer(Chofer chofer) throws Exception{
        
         if (this.validarChofer(chofer)) {

            Domicilio domicilioChofer = chofer.getDomicilio();
            DomicilioBO domicilioBO = new DomicilioBO();
            Documento documentoChofer = chofer.getDocumento();
            DocumentoBO documentoBO = new DocumentoBO();
            ChoferDAO choferDAO = new ChoferDAO();
            try{
                domicilioChofer = domicilioBO.saveNewDomicilioIfNotExists(domicilioChofer); // Guardo el domicilio
                chofer.setDomicilio(domicilioChofer);
                documentoChofer = documentoBO.saveNewDocumentoIfNotExists(documentoChofer); // Guardo el documento
                chofer.setDocumento(documentoChofer);
                chofer = choferDAO.update(chofer); // Guardo el chofer
            }catch(HibernateException ex){
                throw new Exception(ex);
            }catch(Exception hex){
                throw new Exception(hex);
            }
            
            
        } else {
            throw new Exception("Ha ocurrido un error, por favor revise los datos ingresados.");
        }

        
        return chofer;
    }

    public void deleteChofer(Chofer chofer) throws Exception{
        
        /*
        Debo borrar primero todo lo que haga referencia a Chofer
        */
        
        try{
            ChoferDAO choferDAO = new ChoferDAO();
            AutoBO autoBO = new AutoBO();
            
            List<Auto> autos = autoBO.getAutosByChofer(chofer);
            if(autos != null && !autos.isEmpty()){
                for(Auto auto : autos){
                    autoBO.delete(auto);
                }
            }
            
            /*
            *   TODO: Borrar CuentaCorrienteChofer!!!
            */

            ViajeBO viajeBO = new ViajeBO();
            viajeBO.deleteChoferAsignado(chofer);
            
            Documento documento = chofer.getDocumento();
            choferDAO.delete(chofer);
            
            DocumentoBO documentoBO = new DocumentoBO();
            documentoBO.deleteDocumento(documento);
            
        }catch(HibernateException hex){
            throw new Exception(hex);            
        }
        
    }

    public int getChoferesCount() throws Exception{
        int choferesTotales = 0;
        ChoferDAO choferDAO = new ChoferDAO();
        
        try{
            choferesTotales = choferDAO.getCount(Chofer.class);
        }catch(HibernateException ex){
            throw new Exception(ex);
        }
        
        return choferesTotales; 
    }

    public List<Chofer> getAllChoferes(int paginaActual) throws Exception {
         List<Chofer> losChoferes = new ArrayList<Chofer>();

        int start = 0;
        
        if(paginaActual > 1){
            start = ((paginaActual - 1) * Constantes.PAG_MAX_RESULTS) + 1;
        }
         
        try {
            ChoferDAO choferDAO = new ChoferDAO();
            losChoferes = choferDAO.getAll(Chofer.class, start);
        } catch (HibernateException hex) {
            throw new Exception(hex);
        }

        return losChoferes;
    }

}
